/*
 * main.c
 *
 *  Created on: 05/06/2012
 *      Author: annibal
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "leitura.h"
#include "automato.h"

/* Função para imprimir a configuração de um AF */
void imprimeAF(Automato *M, FILE *saida) {
	int i, j;

	fprintf(saida, "Estados: ");
	for (i = 0; i < M->numEstados; i++) {
		fprintf(saida, "%s ", M->estados[i].nome);
	}

	fprintf(saida, "\n\nAlfabeto: ");
	for (i = 0; i < M->tamAlfabeto; i++) {
		fprintf(saida, "%c ", M->alfabeto[i]);
	}

	fprintf(saida, "\n\nEstados finais: ");
	for (i = 0; i < M->numEstados; i++) {
		if (M->estados[i].final == 1) {
			fprintf(saida, "%s ", M->estados[i].nome);
		}
	}

	fprintf(saida, "\n\nEstado inicial: %s", M->estadoInicial->nome);

	fprintf(saida, "\n\nTransicoes:\n\n");

	fprintf(saida, "%8s", "");
	for (i = 0; i < M->tamAlfabeto; i++) {
		fprintf(saida, "%8c", M->alfabeto[i]);
	}
	fprintf(saida, "%8s\n", "outros");

	for (i = 0; i < M->numEstados; i++) {
		fprintf(saida, "%8s", M->estados[i].nome);

		for (j = 0; j <= M->tamAlfabeto; j++) {
			fprintf(saida, "%8s", M->transicoes[i][j]->nome);
		}
		fprintf(saida, "\n");
	}
}

/* Função para abertura de arquivos */
FILE *abreArquivo(char *modo) {
	char nome_arq[TAM_STRING];
	FILE *arq;

	do {
		gets(nome_arq);
	} while (strlen(nome_arq) == 0);
	arq = fopen(nome_arq, modo);
	if (arq == NULL) {
		printf("Erro: falha na abertura de arquivo\n");
		abort();
	}

	return arq;
}

int main() {
	Automato M;
	FILE *arq, *saida;
	int continua = TRUE, reutiliza = FALSE;
	char cadeia[MAX_CADEIA];

	while (continua == TRUE) {
		if (reutiliza == FALSE) {
			printf("Digite o nome do arquivo contendo as "
					"especificações do autômato: ");
			arq = abreArquivo("r");
			criaAutomato(&M, arq);
			fclose(arq);
			arq = NULL;

			printf("Digite o nome do arquivo no qual armazenar "
					"o autômato criado: ");
			arq = abreArquivo("w");
			imprimeAF(&M, arq);
			fclose(arq);
		}

		printf("Digite o nome do arquivo contendo cadeia a ser analisada: ");
		arq = abreArquivo("r");

		printf("Digite o nome do arquivo no qual armazenar "
				"as transações efetuadas: ");
		saida = abreArquivo("w");

		strcpy(cadeia, leCadeia(arq));
		fclose(arq);


		fprintf(saida, "Cadeia: %s\n\nTransicoes\n%10s %10s %10s", cadeia,
				"Origem", "Simbolo", "Destino");

		if (analisaCadeia(&M, cadeia, saida) == 1) {
			fprintf(saida, "\nCadeia aceita\n\n");
		} else {
			fprintf(saida, "\nCadeia rejeitada\n\n");
		}
		fclose(saida);

		printf("\n\nDigite 1 para realizar mais um teste "
				"ou digite 0 para encerrar: ");
		scanf("%d", &continua);
		if (continua == TRUE) {
			printf("Digite 1 para utilizar o mesmo autômato "
					"ou digite 0 para criar um novo autômato: ");
			scanf("%d", &reutiliza);
		}
	}

	return 0;
}
